const sql = require("../../mysql");

module.exports = async ctx => {
  try {
    const { parentId, idArray } = ctx.request.body;

    // 思路：复制文件以及文件夹，需要把该文件夹下的所有文件都复制一份出来
    // 在此之前需要验证目标文件夹是否在该文件夹下或者是否为当前文件夹

    // 验证
    let parentFolder = await sql.Vfile.findOne({
      where: {
        id: parentId
      }
    });

    if (!parentFolder) {
      ctx.body = {
        code: -1,
        msg: "未找到 id 为 " + parentId + " 的文件夹"
      };
      return;
    }

    if (parentId && !parentFolder.isFolder) {
      ctx.body = {
        code: -1,
        msg: "传入目标必须是文件夹"
      };
      return;
    }

    if (idArray.includes(parentId)) {
      ctx.body = {
        code: -1,
        msg: "不能移动或复制到选中文件夹目录下"
      };
      return;
    }

    // 获取 id 对应的文件
    let getFileList = await sql.Vfile.findAll({
      where: {
        id: { [sql.Op.in]: idArray }
      }
    });

    // 验证以及获取 id 对应的文件列表
    async function validateList(fileList) {
      return new Promise(async (resolve, reject) => {
        try {
          for (let index = 0; index < fileList.length; index++) {
            const parentFile = fileList[index];

            // 获取每一个文件夹下的所有文件
            let findFileList = await sql.Vfile.findAll({
              where: {
                parentId: parentFile.id
              }
            });

            if (parentFile.isFolder) {
              parentFile.dataValues.children = findFileList || [];
            }

            let tmpFileList = findFileList
              .filter(e => e.isFolder)
              .map(e => e.id);

            if (tmpFileList.includes(parentId)) {
              reject("不能移动或复制到选中文件夹目录下");
            } else {
              if (tmpFileList && tmpFileList.length) {
                await validateList(parentFile.dataValues.children);
              }
              resolve();
            }
          }
        } catch (error) {
          console.log(error);
          reject(error);
        }
      });
    }

    try {
      await validateList(getFileList);
    } catch (error) {
      console.log(error);
      ctx.body = {
        code: -1,
        msg: "不能移动或复制到选中文件夹目录下"
      };
      return;
    }

    // 拷贝
    // 将 idArray 内包含的文件夹以及文件全部复制一遍

    function insertFile(fileList, pid) {
      return new Promise(async (resolve, reject) => {
        for (let index = 0; index < fileList.length; index++) {
          const file = fileList[index];

          let realFile = await sql.Vfile.create({
            name: file.name,
            isFolder: file.isFolder,
            userId: file.userId,
            rfileId: file.rfileId,
            parentId: pid
          });

          if (file.dataValues.children && file.dataValues.children.length) {
            await insertFile(file.dataValues.children, realFile.id);
          }
        }
        resolve();
      });
    }

    await insertFile(getFileList, parentId);

    ctx.body = {
      code: 0,
      msg: "成功",
      data: getFileList
    };
    return;
  } catch (error) {
    console.log(error);
    ctx.response.status = 200;

    ctx.body = {
      code: -1,
      msg: error.errors ? error : error.errors[0].message
    };
  }
};
